package main

import (
	"fmt"
	"reflect"
)

type a struct {
	Name string
	Age  string
}

func (this a) Test() {
	fmt.Println("test ok.")
}

func (this *a) Get() {
	fmt.Println("get ok .")
}

func (this *a) Print(id int, name string) {
	fmt.Println("id is ", id)
	fmt.Println("name is ", name)
}

func Test() {
	fmt.Println("func test is ok .")
}

func main() {
	d := a{
		Name: "aaa",
		Age:  "bbb",
	}
	v := reflect.ValueOf(d)
	ele := v.Elem()
	t := ele.Type()
	fmt.Println("\n 读取对象的所有属性")
	for i := 0; i < v.NumField(); i++ {
		fmt.Println(t.Field(i).Name, ele.Field(i).Interface())
	}
	fmt.Println("\n 获取对象的所有方法:")

	for i := 0; i < t.NumField(); i++ {
		fmt.Println(t.Method(i).Name)
	}
	// 反射调用方法:
	fmt.Println("\n 测试函数调用")
	v.MethodByName("Get").Call(nil)
	v.MethodByName("Test").Call(nil)
	ele.MethodByName("Test").Call(nil)
	fmt.Println("测试传值调用函数")
}
